home *** CD-ROM | disk | FTP | other *** search
/ Aminet 28 / Aminet 28 (1998)(GTI - Schatztruhe)[!][Dec 1998].iso / Aminet / comm / fido / ConvPktSrc.lha / ConvPkt / jbio.c < prev    next >
C/C++ Source or Header  |  1996-09-11  |  3KB  |  193 lines

  1. #include <exec/types.h>
  2. #include <exec/memory.h>
  3. #include <dos/dos.h>
  4. #include <jbio.h>
  5.  
  6. #include <string.h>
  7. #include <clib/alib_protos.h>
  8. #include <clib/exec_protos.h>
  9. #include <clib/dos_protos.h>
  10.  
  11. extern BOOL nomem;
  12. extern BOOL diskfull;
  13.  
  14. /* OBS! Klarar _inte_ Read/Write mode */
  15.  
  16. struct jbFile *jbOpen(UBYTE *name,UWORD mode,ULONG bufsize)
  17. {
  18.    struct jbFile *jb;
  19.  
  20.    if(!(jb=(struct jbFile *)AllocMem(sizeof(struct jbFile),MEMF_CLEAR)))
  21.    {
  22.       nomem=TRUE;
  23.       return(NULL);
  24.    }
  25.  
  26.    if(!(jb->buf=(UBYTE *)AllocMem(bufsize,MEMF_ANY)))
  27.    {
  28.       nomem=TRUE;
  29.       FreeMem(jb,sizeof(struct jbFile));
  30.       return(NULL);
  31.    }
  32.  
  33.    if(!(jb->fh=Open(name,mode)))
  34.    {
  35.       FreeMem(jb->buf,bufsize);
  36.       FreeMem(jb,sizeof(struct jbFile));
  37.       return(NULL);
  38.    }
  39.  
  40.    jb->mode=mode;
  41.    jb->bufsize=bufsize;
  42.  
  43.    return(jb);
  44. }
  45.  
  46. jbClose(struct jbFile *jb)
  47. {
  48.    if((jb->mode==MODE_NEWFILE || jb->mode==MODE_READWRITE) && jb->pos!=0)
  49.       Write(jb->fh,jb->buf,jb->pos);
  50.  
  51.    Close(jb->fh);
  52.    FreeMem(jb->buf,jb->bufsize);
  53.    FreeMem(jb,sizeof(struct jbFile));
  54. }
  55.  
  56. jbGetChar(struct jbFile *jb)
  57. {
  58.    if(jb->pos==jb->len)
  59.    {
  60.       jb->pos=0;
  61.       jb->len=Read(jb->fh,jb->buf,jb->bufsize);
  62.       if(jb->len==0) return(-1);
  63.    }
  64.    return(jb->buf[jb->pos++]);
  65. }
  66.  
  67. jbRead(struct jbFile *jb,void *buf,ULONG bytes)
  68. {
  69.    ULONG toread,copy;
  70.  
  71.    toread=bytes;
  72.    copy=0;
  73.  
  74.    while(toread)
  75.    {
  76.       if(jb->pos==jb->len)
  77.       {
  78.          jb->len=Read(jb->fh,jb->buf,jb->bufsize);
  79.          if(jb->len==0) return(bytes-toread);
  80.          jb->pos=0;
  81.       }
  82.  
  83.       if(toread<jb->len-jb->pos) copy=toread;
  84.       else                       copy=jb->len-jb->pos;
  85.  
  86.       CopyMem((APTR)&jb->buf[jb->pos],&((UBYTE *)buf)[bytes-toread],copy);
  87.       toread-=copy;
  88.       jb->pos+=copy;
  89.    }
  90.  
  91.    return(bytes);
  92. }
  93.  
  94. jbPutChar(struct jbFile *jb, UBYTE ch)
  95. {
  96.    if(jb->pos==jb->bufsize)
  97.    {
  98.       Write(jb->fh,jb->buf,jb->pos);
  99.       jb->pos=0;
  100.  
  101.       if(IoErr()!=0)
  102.       {
  103.          diskfull=TRUE;
  104.          return;
  105.       }
  106.    }
  107.  
  108.    jb->buf[jb->pos]=ch;
  109.    jb->pos++;
  110.    jb->len++;
  111. }
  112.  
  113. jbWrite(struct jbFile *jb,void *buf, ULONG bytes)
  114. {
  115.    ULONG towrite,copy;
  116.  
  117.    towrite=bytes;
  118.    copy=0;
  119.  
  120.    while(towrite)
  121.    {
  122.       if(jb->pos==jb->bufsize)
  123.       {
  124.          Write(jb->fh,jb->buf,jb->pos);
  125.          jb->pos=0;
  126.  
  127.          if(IoErr()!=0)
  128.          {
  129.             diskfull=TRUE;
  130.             return;
  131.          }
  132.       }
  133.  
  134.       if(towrite<jb->bufsize-jb->pos) copy=towrite;
  135.       else                            copy=jb->bufsize-jb->pos;
  136.  
  137.       CopyMem(&((UBYTE *)buf)[bytes-towrite],(APTR)&jb->buf[jb->pos],copy);
  138.       towrite-=copy;
  139.       jb->pos+=copy;
  140.       jb->len+=copy;
  141.    }
  142. }
  143.  
  144. jbPuts(struct jbFile *jb, UBYTE *str)
  145. {
  146.    jbWrite(jb,str,strlen(str));
  147. }
  148.  
  149. jbFGets(struct jbFile *jb,UBYTE *str,ULONG max)
  150. {
  151.    ULONG d;
  152.  
  153.    d=0;
  154.  
  155.    if(max==0)
  156.       return(0);
  157.  
  158.    for(;;)
  159.    {
  160.       if(d==max-1)
  161.       {
  162.          str[d]=0;
  163.          return(d);
  164.       }
  165.  
  166.       if(jb->pos==jb->len)
  167.       {
  168.          jb->len=Read(jb->fh,jb->buf,jb->bufsize);
  169.          jb->pos=0;
  170.  
  171.          if(jb->len==0)
  172.          {
  173.             str[d]=0;
  174.             return(d);
  175.          }
  176.       }
  177.  
  178.       str[d]=jb->buf[jb->pos];
  179.  
  180.       if(str[d]==10 || str[d]==13)
  181.       {
  182.          d++;
  183.          jb->pos++;
  184.          str[d]=0;
  185.  
  186.          return(d);
  187.       }
  188.  
  189.       d++;
  190.       jb->pos++;
  191.    }
  192. }
  193.